#ifndef AVALON_SERIALIZATION_HPP
#define AVALON_SERIALIZATION_HPP
#include "Avalon/Base/Base.hpp"

namespace Avalon {
namespace Serialization {
  class BinaryDataShuttleFactory;
  class BinaryDeserializer;
  class BinarySerializer;
  class DataShuttle;
  class DataShuttleFactory;
  class Deserializer;
  class JsonDataShuttleFactory;
  class JsonDeserializer;
  class JsonSerializer;
  class SerializationException;
  class Serializer;
  template<typename T, typename Enable = void> struct Shuttler;
  template<typename T> struct Version;

  //! Signature for shuttling a value, must be specialized for each type.
  /*!
    \param shuttle The DataShuttle to use.
    \param value The value to shuttle.
    \param version The class version being serialized.
  */
  template<typename T>
  void Shuttle(DataShuttle* shuttle, T& value, unsigned int version);
}
}

#endif // AVALON_SERIALIZATION_HPP
